//
// Created by Crestimes on 2024/11/15.
//

#ifndef PARSER_H
#define PARSER_H

#include <vector>
#include <fstream>
#include <map>
#include <stack>

#include "GNode.h"
#include "Production.h"
using namespace std;


class Parser {
public:
    Parser(const vector<Production>& productions, const vector<map<string, string>>& lrTable,
           const set<string>& allEndCharNames, const vector<GNode>& tokens);

    void parse();

private:
    static GNode buildGNode(const Production& production, stack<int>& stateStack, stack<GNode>& nodeStack) ;
    static void printGTree(const GNode& node, int depth);

    vector<Production> productions; // 所有的文法语句（0号文法是S'->S）
    vector<map<string, string>> lrTable; // lr分析表
    set<string> allEndCharNames; // 所有文法中的终结符符号的名字集合
    vector<GNode> tokens; // 代码分词结果，每个分词结果初始化为一个语法树节点
};


#endif //PARSER_H
